<?php
/**
 * User: roman
 * Date: 14.07.11
 * Time: 14:02
 */

namespace Managers;

class Pages extends BaseManager
{

    protected $_entity = '\Catalog\Pages';
    protected $_transEntity = '\Catalog\Translates';
    protected $_localeEntity = '\Catalog\Locales';

    protected $_defaultLocale = 'en';
    protected $_cacheTime = 1800; //  60 * 30

    /**
     * Возвращает список страниц в зависимости от локали.
     * @param $locale
     * @param bool $onlyMain
     * @return array
     */
    public function all($locale, $onlyMain = false)
    {
        $pages = $this->_getCacheManager()->load('pages_' . $locale);

        if (!$pages) {

            $pages = $this->_em->createQueryBuilder()
                    ->select('page')
                    ->from($this->_entity, 'page')
                    ->where('page.main = :main')
                    ->setParameter('main', $onlyMain)
                    ->getQuery()
                    ->getArrayResult();

            foreach ($pages as $iter => $page) {

                $pages[$iter]['translation'] = $this->shortOneTranslation($locale, $page['id']);

            }

            $pages = $this->_getCacheManager()->save($pages, 'pages_' . $locale, array('pages', $locale), $this->_cacheTime);
        }

        return $pages;

    }

    public function child($parent, $locale)
    {

        $pages = $this->_em->createQueryBuilder()
                ->select('page')
                ->from($this->_entity, 'page')
                ->where('page.is_main = 0')
        //->setParameter('m', 0)
                ->andWhere('page.parent = :par')
                ->setParameter('par', $parent)
                ->getQuery()
                ->getArrayResult();

        foreach ($pages as $iter => $page) {

            $pages[$iter]['translation'] = $this->oneTranslation($locale, $page['id']);

        }

        return $pages;

    }

    /**
     * Возвращает укороченный перевод одной страницы (без контента)
     * @return array
     */
    public function shortOneTranslation($locale, $page, $recursion = false)
    {

        $translate = $this->_em->createQueryBuilder()
                ->select('trans.title', 'lang.locale')
                ->from($this->_transEntity, 'trans')
                ->join('trans.locale', 'lang');

        if (isset($page)) {
            $translate = $translate->where('trans.page = :page')->setParameter('page', $page);
        }

        $translate = $translate
                ->andWhere('lang.locale = :locale')->setParameter('locale', $locale)
                ->setMaxResults(1)
                ->getQuery()
                ->getArrayResult();
        /**
         * Если нету перевода, подгружаем перевод по умолчанию.
         */
        if (0 == count($translate) && !$recursion) {

            $translate = $this->shortOneTranslation($this->_defaultLocale, $page, true);
        }

        return $translate;

    }

    /**
     * Возвращает перевод одной страницы.
     * @param $locale
     * @param $page
     * @param bool $recursion
     * @return array
     */
    public function oneTranslation($locale, $page, $recursion = false)
    {
        $translate = $this->_getCacheManager()->load('page_' . $locale . '_' . $page);

        if (!$translate) {
            $translate = $this->_em->createQueryBuilder()
                    ->select('trans', 'lang')
                    ->from($this->_transEntity, 'trans')
                    ->join('trans.locale', 'lang');

            if (isset($page)) {
                $translate = $translate->where('trans.page = :page')->setParameter('page', $page);
            }

            $translate = $translate
                    ->andWhere('lang.locale = :locale')->setParameter('locale', $locale)
                    ->setMaxResults(1)
                    ->getQuery()
                    ->getArrayResult();
            /**
             * Если нету перевода, подгружаем перевод по умолчанию.
             */
            if (0 == count($translate) && !$recursion) {

                $translate = $this->oneTranslation($this->_defaultLocale, $page, true);
            }

            $this->_getCacheManager()->save($translate, 'page_' . $locale . '_' . $page, array('page', $locale, strval($translate[0]['id'])), $this->_cacheTime);
        }

        return $translate;

    }

    public function qb()
    {

        $res = $this->_em->createQueryBuilder()
                ->select('page')
                ->from($this->_entity, 'page');

        return $res;

    }

}
